package pe.com.bbva.targps.dao.impl;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import pe.com.bbva.targps.dao.TarjetaDAO;
import pe.com.bbva.targps.domain.Tarjeta;
import pe.com.bbva.targps.domain.TarjetaFechaGPS;
import pe.com.bbva.util.Constantes;
import pe.com.stefanini.core.dao.GenericDAOImpl;
import pe.com.stefanini.core.exceptions.BOException;
import pe.com.stefanini.core.exceptions.DAOException;
import pe.com.stefanini.core.util.FechaUtil;

@Service("tarjetaDAO")
public class TarjetaDAOImpl extends GenericDAOImpl<Tarjeta> implements TarjetaDAO{
	
	@Autowired
	public TarjetaDAOImpl(SessionFactory sessionFactory) {
		super(sessionFactory);
	}
	
	@SuppressWarnings("unchecked")
	public List<Tarjeta> findTarjetas(Tarjeta tarjeta)throws BOException, DAOException {
		String where = "";
		if(tarjeta.getDescripcion()!= null && !tarjeta.getDescripcion().equals("")){
			where = where  + (where==""?"":" AND ") + "upper(descripcion) like upper('%" +	tarjeta.getDescripcion() + "%') ";
		}
		if(tarjeta.getEstado()!= null && !tarjeta.getEstado().equals("")){
			where = where  + (where==""?"":" AND ") + "estado = '" +	tarjeta.getEstado() + "' ";
		}
		if(tarjeta.getEstadoFacturacion()!= null && !tarjeta.getEstadoFacturacion().equals("")){
			where = where  + (where==""?"":" AND ") + "estadoFacturacion = '" + tarjeta.getEstadoFacturacion() + "' ";
		}
		if(tarjeta.getFechaCoordinacion()!= null && !tarjeta.getFechaCoordinacion().equals("")){
			where = where  + (where==""?"":" AND ") + "to_char(fechaCoordinacion,'dd/mm/yyyy')= '" + FechaUtil.formatFecha(tarjeta.getFechaCoordinacion(), FechaUtil.DDMMYYYY) + "' ";
		}
		if(tarjeta.getFechaProceso()!= null && !tarjeta.getFechaProceso().equals("")){
			where = where  + (where==""?"":" AND ") + "to_char(fechaProceso,'dd/mm/yyyy') = '" + FechaUtil.formatFecha(tarjeta.getFechaProceso(),FechaUtil.DDMMYYYY) + "' ";
		}
		if(tarjeta.getFormFacturacion()!= null && !tarjeta.getFormFacturacion().equals("")){
			where = where  + (where==""?"":" AND ") + "formFacturacion like '%" +	tarjeta.getFormFacturacion() + "%' ";
		}
		if(tarjeta.getIdProcesoCarga()!= null && !tarjeta.getIdProcesoCarga().equals("")){
			where = where  + (where==""?"":" AND ") + "idProcesoCarga = '" + tarjeta.getIdProcesoCarga() + "' ";
		}
		if(tarjeta.getIdTurno()!= null && !tarjeta.getIdTurno().equals("")){
			where = where  + (where==""?"":" AND ") + "idTurno = '" + tarjeta.getIdTurno() + "' ";
		}
		if(tarjeta.getCodTarjeta()!= null && !tarjeta.getCodTarjeta().equals("")){
			where = where  + (where==""?"":" AND ") + "codTarjeta = '" +	tarjeta.getCodTarjeta() + "' ";
		}
		if(tarjeta.getMaterial()!= null && !tarjeta.getMaterial().equals("")){
			where = where  + (where==""?"":" AND ") + "material like '%" + tarjeta.getMaterial() + "%' ";
		}
		if(tarjeta.getNumDocumento()!= null && !tarjeta.getNumDocumento().equals("")){
			where = where  + (where==""?"":" AND ") + "numDocumento like '%" +	tarjeta.getNumDocumento() + "%' ";
		}
		if(tarjeta.getNumTarjeta()!= null && !tarjeta.getNumTarjeta().equals("")){
			where = where  + (where==""?"":" AND ") + "numTarjeta like '%" + tarjeta.getNumTarjeta().replaceAll("-","") + "%' ";
		}
		if(tarjeta.getOficina()!= null && !tarjeta.getOficina().equals("")){
			where = where  + (where==""?"":" AND ") + "oficina like '%" + tarjeta.getOficina() + "%' ";
		}
		if(tarjeta.getTamanio()!= null && !tarjeta.getTamanio().equals("")){
			where = where  + (where==""?"":" AND ") + "tamanio = '" +	tarjeta.getTamanio() + "' ";
		}
		if(tarjeta.getTecnologia()!= null && !tarjeta.getTecnologia().equals("")){
			where = where  + (where==""?"":" AND ") + "tecnologia like '%" + tarjeta.getTecnologia() + "%' ";
		}
		if(tarjeta.getTipoArchivo()!= null && !tarjeta.getTipoArchivo().equals("")){
			where = where + (where==""?"":" AND ") + "tipoArchivo = '" + tarjeta.getTipoArchivo() + "' ";
		}
		if(tarjeta.getTipoDocumento()!= null && !tarjeta.getTipoDocumento().equals("")){
			where = where + (where==""?"":" AND ") + "tipoDocumento = '" + tarjeta.getTipoDocumento() + "' ";
		}
		if(tarjeta.getTipoSolicitud()!= null && !tarjeta.getTipoSolicitud().equals("")){
			where = where + (where==""?"":" AND ") + "tipoSolicitud = '" + tarjeta.getTipoSolicitud() + "' ";
		}
		if(tarjeta.getReferencia()!= null && !tarjeta.getReferencia().equals("")){
			where = where + (where==""?"":" AND ") + "referencia = '" + tarjeta.getReferencia() + "' ";
		}
		if(tarjeta.getBin()!= null && !tarjeta.getBin().equals("")){
			where = where + (where==""?"":" AND ") + "substr(to_number(numTarjeta),1,8) like '%" +tarjeta.getBin() + "%' ";
		}
		if(tarjeta.getId()!= null && !tarjeta.getId().equals("")){
			where = where + (where==""?"":" AND ") + "id = '" +	tarjeta.getId() + "') ";
		}
		if(!where.equals("")){
			where = Constantes.WHERE_CLAUSE + where;
		}
		String orders = " order by fechaEstampacion desc";
		List<Tarjeta> listaTarjetas = super.executeQuery(Tarjeta.class,where,orders);
		return listaTarjetas;
	}
	
	@SuppressWarnings("unchecked")
	public List<Tarjeta> findTarjetasRango(Tarjeta tarjeta, String fechaInicio, String fechaFin)throws BOException, DAOException {
		String where = "";
		if(fechaInicio!=null && !fechaInicio.equals("")){
			if(fechaFin!=null && !fechaFin.equals("") && !fechaFin.equals(fechaInicio)){
				where = where + (where==""?"":" AND ") + "fechaProceso BETWEEN to_date('" + fechaInicio + "','dd/mm/yyyy') and to_date('" + fechaFin + "','dd/mm/yyyy')";
			}else{
				where = where + (where==""?"":" AND ") + "to_char(fechaProceso,'dd/mm/yyyy') = '" + fechaInicio + "' ";				
			}
		}
		if(tarjeta.getDescripcion()!= null && !tarjeta.getDescripcion().equals("")){
			where = where  + (where==""?"":" AND ") + "upper(descripcion) like upper('%" +	tarjeta.getDescripcion() + "%') ";
		}
		if(tarjeta.getEstado()!= null && !tarjeta.getEstado().equals("")){
			where = where  + (where==""?"":" AND ") + "estado = '" + tarjeta.getEstado() + "' ";
		}
		if(tarjeta.getEstadoFacturacion()!= null && !tarjeta.getEstadoFacturacion().equals("")){
			where = where  + (where==""?"":" AND ") + "estadoFacturacion = '" + tarjeta.getEstadoFacturacion() + "' ";
		}
		if(tarjeta.getFechaCoordinacion()!= null && !tarjeta.getFechaCoordinacion().equals("")){
			where = where  + (where==""?"":" AND ") + "fechaCoordinacion = '" +	tarjeta.getFechaCoordinacion() + "' ";
		}
		if(tarjeta.getFechaModificacionFormato()!= null && !tarjeta.getFechaModificacionFormato().equals("")){
			where = where  + (where==""?"":" AND ") + "fechaModificacionFormato = '" +	tarjeta.getFechaModificacionFormato() + "' ";
		}
		if(tarjeta.getCodTarjeta()!= null && !tarjeta.getCodTarjeta().equals("")){
			where = where  + (where==""?"":" AND ") + "codTarjeta = '" +	tarjeta.getCodTarjeta() + "' ";
		}
		if(tarjeta.getFormFacturacion()!= null && !tarjeta.getFormFacturacion().equals("")){
			where = where  + (where==""?"":" AND ") + "formFacturacion like '%" +	tarjeta.getFormFacturacion() + "%' ";
		}
		if(tarjeta.getIdProcesoCarga()!= null && !tarjeta.getIdProcesoCarga().equals("")){
			where = where  + (where==""?"":" AND ") + "idProcesoCarga = '" + tarjeta.getIdProcesoCarga() + "' ";
		}
		if(tarjeta.getIdTurno()!= null && !tarjeta.getIdTurno().equals("")){
			where = where  + (where==""?"":" AND ") + "idTurno = '" + tarjeta.getIdTurno() + "' ";
		}
		if(tarjeta.getMaterial()!= null && !tarjeta.getMaterial().equals("")){
			where = where  + (where==""?"":" AND ") + "material like '%" + tarjeta.getMaterial() + "%' ";
		}
		if(tarjeta.getNumDocumento()!= null && !tarjeta.getNumDocumento().equals("")){
			where = where  + (where==""?"":" AND ") + "numDocumento like '%" +	tarjeta.getNumDocumento() + "%' ";
		}
		if(tarjeta.getNumTarjeta()!= null && !tarjeta.getNumTarjeta().equals("")){
			where = where  + (where==""?"":" AND ") + "numTarjeta like '%" + tarjeta.getNumTarjeta().replaceAll("-","") + "%' ";
		}
		if(tarjeta.getOficina()!= null && !tarjeta.getOficina().equals("")){
			where = where  + (where==""?"":" AND ") + "oficina like '%" + tarjeta.getOficina() + "%' ";
		}
		if(tarjeta.getTamanio()!= null && !tarjeta.getTamanio().equals("")){
			where = where  + (where==""?"":" AND ") + "tamanio = '" +	tarjeta.getTamanio() + "' ";
		}
		if(tarjeta.getTecnologia()!= null && !tarjeta.getTecnologia().equals("")){
			where = where  + (where==""?"":" AND ") + "tecnologia like '%" + tarjeta.getTecnologia() + "%' ";
		}
		if(tarjeta.getTipoArchivo()!= null && !tarjeta.getTipoArchivo().equals("") && !tarjeta.getTipoArchivo().equals("0")){
			where = where + (where==""?"":" AND ") + "tipoArchivo = '" + tarjeta.getTipoArchivo() + "' ";
		}
		if(tarjeta.getTipoDocumento()!= null && !tarjeta.getTipoDocumento().equals("") && !tarjeta.getTipoDocumento().equals("0")){
			where = where + (where==""?"":" AND ") + "tipoDocumento = '" + tarjeta.getTipoDocumento() + "' ";
		}
		if(tarjeta.getReferencia()!= null && !tarjeta.getReferencia().equals("")){
			where = where + (where==""?"":" AND ") + "referencia = '" + tarjeta.getReferencia() + "' ";
		}
		if(tarjeta.getTipoSolicitud()!= null && !tarjeta.getTipoSolicitud().equals("")){
			where = where + (where==""?"":" AND ") + "tipoSolicitud = '" + tarjeta.getTipoSolicitud() + "' ";
		}
		if(tarjeta.getId()!= null && !tarjeta.getId().equals("")){
			where = where + (where==""?"":" AND ") + "id = '" +	tarjeta.getId() + "') ";
		}
		if(tarjeta.getBin()!= null && !tarjeta.getBin().equals("")){
			where = where + (where==""?"":" AND ") + "substr(to_number(numTarjeta),1,8) like '%" +tarjeta.getBin() + "%' ";
		}
		if(!where.equals("")){
			where = Constantes.WHERE_CLAUSE + where;
		}
		String orders = " order by fechaEstampacion desc";
		List<Tarjeta> listaTarjetas = super.executeQuery(Tarjeta.class,where,orders);
		return listaTarjetas;
	}
	
	@SuppressWarnings("unchecked")
	public List<TarjetaFechaGPS> findTarjetasGPS(Tarjeta tarjeta)throws BOException, DAOException {
		String select = "SELECT FEC_ESTAMPACION FECHA, COUNT(*) CANTIDAD FROM TARGPS.TTARGPS_TARJETA ";
		String where = "";
		if(tarjeta.getIdProcesoCarga()!= null && !tarjeta.getIdProcesoCarga().equals("")){
			where = where  + (where==""?"":" AND ") + "idProcesoCarga = '" + tarjeta.getIdProcesoCarga() + "' ";
		}
		if(tarjeta.getTamanio()!= null && !tarjeta.getTamanio().equals("")){
			where = where  + (where==""?"":" AND ") + "tamanio = '" +	tarjeta.getTamanio() + "' ";
		}
		if(tarjeta.getCodTarjeta()!= null && !tarjeta.getCodTarjeta().equals("")){
			where = where  + (where==""?"":" AND ") + "codTarjeta = '" + tarjeta.getCodTarjeta() + "' ";
		}
		if(tarjeta.getBin()!= null && !tarjeta.getBin().equals("")){
			where = where + (where==""?"":" AND ") + "substr(to_number(numTarjeta),1,8) like '%" +tarjeta.getBin() + "%' ";
		}
		if(!where.equals("")){
			where = Constantes.WHERE_CLAUSE + where;
		}
		String groupBy = " GROUP BY FEC_ESTAMPACION";
		String query = select + where + groupBy;
		List<TarjetaFechaGPS> result = super.executeSQL(query, TarjetaFechaGPS.class);
		return result;
	}
	
	@SuppressWarnings("deprecation")
	public Long ValidaCargaEnProceso() throws DAOException {
		Session hibernateSession = null;
		Connection con = null;
		CallableStatement cstmt =null;
		ResultSet rs  = null;		
		Long IdCarga=0L;
		try {
			hibernateSession = (Session) getHibernateTemplate().getSessionFactory().openSession();
			con = hibernateSession.connection();
			cstmt =con.prepareCall("{call TARGPS.TARGPSPKG.PR_TTARGPS_VALIDAR_ENPROCESO(?)}");			
			cstmt.registerOutParameter(1,oracle.jdbc.OracleTypes.VARCHAR);		
			cstmt.executeQuery();			
			IdCarga = Long.parseLong((String)cstmt.getObject(1));			
		} catch (HibernateException e) {
			e.printStackTrace();
			throw new DAOException(e.getMessage());
		} catch (SQLException e) {
			e.printStackTrace();
			throw new DAOException(e.getMessage());
		} catch (Exception e) {
			e.printStackTrace();
			throw new DAOException(e.getMessage());
		}finally{
			try {
				if(rs!=null){
					rs.close();
				}
				if(cstmt!=null){
					cstmt.close();
				}
				hibernateSession.close();
			} catch (SQLException e) {
				throw new DAOException(e.getMessage());
			} catch (HibernateException e) {
				e.printStackTrace();
				throw new DAOException(e.getMessage());
			} 
		}
		return IdCarga;
	}
}